#include "base_init.h"
#include "base_time.h"
#include "base_log.h"
#include "base_stack_trace.h"
#include "base_memory_pool.h"

namespace El {
namespace Base {

bool base_init(nlohmann::json &config)
{
    std::string log_file = "/mnt/log/app.log";
    int32_t log_max_size = 1024 * 1024;
    int32_t log_max_files = 3;
    std::string level = "info";
    bool log_to_file = false; // 默认不写文件

    if (config.contains("log_file")) {
        log_file = config["log_file"].get<std::string>();
    }
    if (config.contains("log_max_size")) {
        log_max_size = config["log_max_size"].get<int32_t>();
    }
    if (config.contains("log_max_files")) {
        log_max_files = config["log_max_files"].get<int32_t>();
    }
    if (config.contains("log_level")) {
        level = config["log_level"].get<std::string>();
    }
    if (config.contains("log_to_file")) {
        log_to_file = config["log_to_file"].get<bool>();
    }

    // 初始化日志
    Log::GetInstance().enableFileLogging(log_to_file); // 设置是否写文件
    Log::GetInstance().init(log_file, "default", log_max_size, log_max_files);
    Log::GetInstance().setLogLevel(level);

    // 初始化音视频内存池
    MemoryPool::GetInstance().Init(3 * 1024 * 1024, 8);

    // 启动时间同步
    TimeManager::GetInstance().Start();

    // 初始化堆栈跟踪
    StackTrace::GetInstance().Start();

    return true;
}

} // namespace Base
} // namespace El
